package GUI;

import Enumeration.*;
import Monopoly.*;
import Spielfeld.Felder.*;
import X.*;

/**
 * 
 * Klasse zur Steuerung des Bankfensters.
 * 
 * @author 
 *
 *@verison $Revision$
 *
 */
public class BankControl implements IRefreshable{

	private GUIBank m_Gui;
	private ISpielInstance m_Instance;
	private Spieler m_AktSpieler;
	
	public ISpielInstance GameInstance(){return m_Instance; }
	
	/**
	 * Konstruktor
	 * 
	 * @param gameinstance
	 */
	public BankControl(ISpielInstance gameinstance){
		m_Instance = gameinstance;
		m_AktSpieler = m_Instance.Spielleiter().AktuellerSpieler();
		m_Gui = new GUIBank(this);
		Refresh();
	}
	
	public void Show(){	m_Gui.setVisible(true); }
	
	public void Refresh(){
		m_Gui.KaufenButton.setEnabled(zuHaben(m_Instance.Spielleiter().AktuellerSpieler().Position));
		m_Gui.HypoAbzahlen.setEnabled(StatusAbfrage(m_AktSpieler.Position,EnumFeldStatus.Gekauft));	
		m_Gui.HypoAufnehmen.setEnabled(StatusAbfrage(m_AktSpieler.Position,EnumFeldStatus.Hypothek));
		m_Gui.BebauenButton.setEnabled(BeBaubar(m_AktSpieler.Position));
		m_Gui.VerkaufenButton.setEnabled(GebVerkaufenbar(m_AktSpieler.Position));
		FuegeStrasseEin();
		SetzeStrasse();
		m_Gui.repaint();
	}

	public Iterable<Strasse> GetStreets(){
		return m_AktSpieler.GetOwnedStreetsInGroup(m_Instance.Spielfeld());
	}
	
	private void SetzeStrasse(){
		m_Gui.ContentPanel.SetIterator(GetStreets());
		m_Gui.ContentPanel.aktualisieren();
	}
	
	public Iterable<Strasse> GetSelected(){ return m_Gui.ContentPanel.getSelected(); }
	
	private void FuegeStrasseEin(){
		IFeld posi = m_Instance.Spielleiter().AktuellerSpieler().Position;
		m_Gui.InfoText.setText(posi.toString());
	}
	
	private boolean StatusAbfrage(IFeld field, EnumFeldStatus status){
		if(!(field instanceof IOwnableFeld)){
			return false;
		}else{
			IOwnableFeld ownable = (IOwnableFeld)field;
			return (ownable.GetStatus() == status) && (ownable.GetOwner() == m_AktSpieler);
		}
	}
	
	private boolean zuHaben(IFeld feld){
		boolean kfn=true;
		if(!(feld instanceof IOwnableFeld)){
			kfn=false;
		}else if (((IOwnableFeld)feld).GetStatus() != EnumFeldStatus.Frei){
			kfn=false;
		}
		return kfn;
	}
	
	private boolean BeBaubar(IFeld feld){
		if(!(feld instanceof Strasse)){
			return false;
		}else if (((IOwnableFeld)feld).GetStrassenzug().Besitzer() != m_AktSpieler){
			return false;
		}else if (GetLowest().GetBuildings().GetIndex() < Strasse.MaxBuildingIndex){
			return true;
		}else{
			return false;
		}
	}
	
	private Strasse GetLowest(){
		Strasse lowestStrasse = null;
		Strasse aktuelleStrasse = (Strasse)m_AktSpieler.Position;
		Strasse Iterator;
		for(IOwnableFeld value : aktuelleStrasse.GetStrassenzug()){
			Iterator = (Strasse)value;
			if(lowestStrasse == null)
				lowestStrasse = Iterator;
			
			if(lowestStrasse.GetBuildings().GetIndex() < Iterator.GetBuildings().GetIndex())
				lowestStrasse = Iterator;
			
		}
		return lowestStrasse;
	}
	
	private boolean GebVerkaufenbar(IFeld feld){
		if(!(feld instanceof Strasse)){
			return false;
		}else if (((IOwnableFeld)feld).GetStrassenzug().Besitzer() != m_AktSpieler){
			return false;
		}else if (GetHighest().GetBuildings().GetIndex() > 0){
			return true;
		}else{
			return false;
		}
	}
	
	private Strasse GetHighest(){
		Strasse highestStreet = null;
		Strasse aktuelleStrasse = (Strasse)m_AktSpieler.Position;
		Strasse Iterator;
		for(IOwnableFeld value : aktuelleStrasse.GetStrassenzug()){
			Iterator = (Strasse)value;
			if(highestStreet == null)
				highestStreet = Iterator;
			
			if(highestStreet.GetBuildings().GetIndex() > Iterator.GetBuildings().GetIndex())
				highestStreet = Iterator;
			
		}
		return highestStreet;
	}

}
